package com.cskaoyan.javase.oop1._9static._5exercise;

/**
 * @description: 牛刀小试
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 读程序,说出运行结果
 * 对于读程序问题:
 *      1.首先先看main方法
 *      2.不要忘记,启动main方法会触发该类类加载
 *      3.类加载的过程一定先于创建对象
 *      4.类加载可能是连环触发的
 *      5.一个类的类加载全局只有一次
 *
 * 思考:
 * 假如Dog类有静态成员变量创建Demo对象,又是什么情况呢?
 *
 * 对于本案例,要完成Demo类类加载的初始化过程,必须创建Cat对象,于是触发Cat类的类加载
 * Cat类要完成类加载,同样也有初始化的步骤,必须创建Dog对象,于是触发Dog类的类加载
 * Dog类要完成类加载,同样也有初始化的步骤,必须创建Demo对象,这时Demo类已经完成了加载和连接,足够创建它的对象了,不会出现循环依赖类加载的情况
 * 所以静态代码块执行完毕后,第一个要创建的对象是Demo对象,输出dog和demo
 *
 * Demo对象创建完成后,在整个案例中,Dog类率先完成类加载的所有过程,接下来是Cat类,最后才是Demo类完成初始化
 *
 */
public class Demo {
    static {
        System.out.println("Demo 静态代码块执行");
    }
    static Cat cat = new Cat(); //static int a = 10; 静态成员变量的显式赋值
    Dog dog = new Dog();
    Dog dog2;

    public static void main(String[] args) {
       /*System.out.println("hello world!");
        Demo d = new Demo();*/
    }

    public Demo() {
        System.out.println("demo");
    }
}

class Cat {
    static {
        System.out.println("Cat 静态代码块执行");
    }
    static Dog dog = new Dog(); //static3 int a = 10;

    public Cat() {
        System.out.println("cat");
    }
}

class Dog {
    static {
        System.out.println("Dog 静态代码块执行");
    }
    static Demo demo = new Demo();
    public Dog() {
        System.out.println("dog");
    }
}